// 创建文章接口
import pool from '@/server/db'
import { ResultSetHeader } from 'mysql2'
import COS from 'cos-nodejs-sdk-v5'

const config = useRuntimeConfig()
const cos = new COS({
  SecretId: config.secretID,
  SecretKey: config.secretKey,
})

export default defineEventHandler(async event => {
  // 判断用户是否登录
  if (!event.context.userinfo) return r('请登录')
  const { uid } = event.context.userinfo

  // 获取文件
  const body = await readMultipartFormData(event)

  // 数据校验
  if (!body) return r('请上文件')
  if (!body[0].type?.includes('image')) return r('请上传图片类型的文件')

  // 定义存储的文件名
  const filename: string =
    Date.now() + (body[0] as { filename: string }).filename

  // 将文件转换为Blob类型
  const nodeBuffer = body[0].data // 这里是你的Buffer对象

  // 首先你需要确保Buffer的内容能够转换为Uint8Array
  // 因为Blob构造函数接受ArrayBufferView或类似的类型作为参数
  const uint8array = new Uint8Array(nodeBuffer)

  // 然后创建一个Blob对象
  const blob = new Blob([uint8array], { type: body[0].type })

  // 上传文件到cos
  let avatarUrl: string
  try {
    const data = await cos.putObject({
      Bucket: config.bucket /* 填入您自己的存储桶，必须字段 */,
      Region: config.region /* 存储桶所在地域，例如 ap-beijing，必须字段 */,
      Key: filename /* 存储在桶里的对象键（例如1.jpg，a/b/test.txt），必须字段 */,
      Body: nodeBuffer,
    })
    avatarUrl = `https://${data.Location}`
  } catch (error) {
    return r('上传失败 ' + error)
  }

  // 将头像地址插入用户表
  try {
    const [rows] = await pool.execute(
      'UPDATE `users` SET `avatar` = ? WHERE `id` = ?',
      [avatarUrl, uid]
    )
    if ((rows as ResultSetHeader).affectedRows === 0) {
      return r('头像地址保存失败')
    }
    return r('保存成功', 1, { avatarUrl })
  } catch (error) {
    return r('头像地址保存失败:' + error)
  }
})
